namespace test04 {

    //定义
    function add(x: number, y: number): number {
        return x + y
    }
    console.log(add(1, 2)); // 3

    let myAdd = function (x: number, y: number): number {
        return x + y
    }
    console.log(myAdd(2, 3)); // 5

    // 书写完整的函数类型
    let myAdd1: (x: number, y: number) => number
        = function (x: number, y: number): number {
            return x + y
        }
    console.log(myAdd1(2, 3)); // 5

    // 以参数列表的形式写出参数类型，为每个参数指定一个名字和类型。
    let myAdd2: (first: number, second: number) => number
        = function (x: number, y: number): number {
            return x + y
        }
    console.log(myAdd2(2, 3)); // 5

    // 函数的可选参数 ?
    // 通过?表示该参数为可选参数
    const fn1 = (name: string, age?: number): string => {
        return name + age
    }
    console.log(fn1('张三')); // 张三undefined
    console.log(fn1('张三', 21)); // 张三21


    // 函数参数的默认值
    const fn2 = (name: string = '我是默认值'): string => {
        return name
    }
    console.log(fn2()); // 我是默认值
    console.log(fn2('李四')); // 李四

    // 定义剩余参数
    const fn3 = (array: number[], ...items: any[]): any[] => {
        console.log(items); // [ '4', '5', '6' ]
        return [...array, ...items]

    }
    let a: number[] = [1, 2, 3]
    console.log(fn3(a, '4', '5', '6')); // [ 1, 2, 3, '4', '5', '6' ]

    // 定义接口函数
    interface Add {
        (num: number, num2: number): number
    }
    const fn4: Add = (num: number, num2: number): number => {
        return num + num2
    }
    console.log(fn4(5, 5)); // 10


    interface User {
        name: string;
        age: number
    }
    function getUserInfo(user: User): User {
        // // 这里可以添加一些逻辑，比如验证用户的年龄是否合理
        // if (user.age < 0) {
        //     throw new Error("Age cannot be negative.");
        // }
        // 可以修改 user 对象的属性，比如增加一些信息
        // user.name += " (Verified)";
        return user
    }
    // 使用示例
    const userInfo: User = {
        name: "Alice",
        age: 30
    };

    // try {
    const updatedUserInfo = getUserInfo(userInfo);
    console.log(updatedUserInfo); // { name: 'Alice (Verified)', age: 30 }
    // } catch (error) {
    // console.error(error);
    // }


    // 函数方法重载
    // 函数方法重载是方法名字相同，而参数不同，返回类型可以相同也可以不相同
    // 如果参数新类型不同，则参数类型应该设置为any
    // 参数数量不同你可以将不同的参数设置为可选
    function fn5(params: number): void
    function fn5(params: string, params2: number): void

    function fn5(params: any, params2?: any): void {

        console.log(params)   // 123         // 123
        console.log(params2)  // undefined   // 456

    }
    fn5(123)// 123   undefined 
    fn5('123', 456) //  123   456

}